// 引入axios核心库和内部封装好的数据类型
import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
// 引入定义好的规则
import RequestData from "./interface";
import qs from 'querystring'
let config = {
    baseURL:'/api'
}
// 定义类  用于封装请求方法和拦截器
class Http {
    // 定义属性
    http: AxiosInstance
    // 构造器
    constructor(config:AxiosRequestConfig) {
        // 重新实例化对象
        this.http = axios.create(config);
        // 请求拦截
        this.http.interceptors.request.use(req => {
            return req;
        })
        // 响应拦截
        this.http.interceptors.response.use(res => {
            return res.data;
        })
    }

    // 定义方法
    // 封装get
    /* 
        url:必传  string类型
        params:可选  object
        
        接收promise对象
    */
    get<T>(url: string, params?: object): Promise<T> {
        return this.http.get(url, {
            params
        })
    }
    // 封装post
    /* 
        url:必传  string
        params:可选 object
        isFile:必传 boolean
    */
    post<T>(url: string, params?: any, isFile: boolean = false): Promise<RequestData> {
        let data: any = {};
        // 图片上传
        if (isFile) {
            data = new FormData();
            for (const [key, val] of Object.entries(params)) {
                data.append(key, val)
            }
        } else {
            // 普通上传
            data = qs.stringify(params);
            // console.log(data);
            
        }
        return this.http.post(url, data)
    }
}

// 暴露
export default new Http(config);